package com.sxfq.loansupermarket.backsystem.modular.dicom.service;

import com.sxfq.loansupermarket.backsystem.modular.dicom.entity.FileHandleResponse;
import com.sxfq.loansupermarket.backsystem.modular.dicom.entity.JstreeNode;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 压缩文件上传，并且解压缩后放到服务器响应目录下，
 * 为什么不直接放压缩包，因为别人看一次，需要解压缩一次，也很浪费系统资源
 *
 * @author xie
 * @version 1.0
 * @Date 2017/5/27
 */
public interface IFileService {
    /**
     * 默认上传zip压缩格式
     * @param file 上传的文件
     * @return 上传的结果UploadResponse对象
     * @throws IOException
     */
    FileHandleResponse uploadFileZip(MultipartFile file, String fileName) throws IOException;

    /**
     *  下载压缩后的项目文件
     *
     * @param filePath 项目路径
     * @return 文件处理结果实体，其中url表示项目压缩后的路径
     * @throws IOException
     */
    FileHandleResponse downloadFileZip(String filePath) throws IOException;

    /**
     *  返回某一结点（即文件夹）的下一级所有子节点，注意这里输入的不是具体文件或者不存在的路径，是已经判定存在的文件夹路径，
     *  如果是请求具体文件或者不存在的路径，在上一层controller层就应该将文件内容读取并返回或者返回错误信息
     *
     * @param filePath 项目路径
     * @param relativePath 节点相比项目路径的相对路径，比如项目路径：
     *                     C:/home/myblog/project/dccb182a7ded477483362ce46be1eb5c/123/
     *                     那么节点路径src/main/java/表示
     *                     C:/home/myblog/project/dccb182a7ded477483362ce46be1eb5c/123/src/main/java/
     *                     但是由于files[i].getName()只会获得abc这样的单层目录名或者abc.java这样的文件名，因此我们要设置下一级的相对路径为;
     *                     relativePath+files[i].getName()(如果是路径，还要包含/)
     *
     * @return 所有子节点的列表
     * @throws IOException
     */
    List<JstreeNode> getAllChildrenNode(String filePath,String relativePath) throws IOException;

    /**
     * NIO方式读取file文件为byte[]
     *
     * @param filename 文件名，要求包含文件绝对路径
     * @return 文件的byte[]形式
     * @throws IOException
     */
    byte[] toByteArray(String filename) throws IOException;
}